#pragma once        // 防止头文件被重复包含
#include <string>   // 字符串类型 std::string
#include <iostream> // 标准输入输出流 std::ostream / std::cout（用于 report 接口）

/**
 * SpaceAsset
 * 所有“太空资产”的抽象基类。
 * 派生类必须实现 type()、report()、save()，以描述自身的类别、
 * 控制台展示形式和磁盘序列化方式。
 */
class SpaceAsset
{
public:
    SpaceAsset(std::string id)
    :m_id(id)
    {
    }
    virtual ~SpaceAsset() = default; // 虚析构，保证派生类对象通过基类指针删除时安全析构

    // === 纯虚接口：派生类必须实现 ===
    virtual std::string type() const = 0;          // 返回对象类型字符串（如 "CargoShip"、"GroundStation"）
    virtual void report() const = 0;               // 向控制台打印对象详情
    virtual void save(std::ostream &os) const = 0; // 将对象序列化写入输出流 os

    // === 通用接口 ===
    /**
     * id()
     * @return 资产唯一标识符（只读）
     */
    virtual std::string id() const { return m_id; }

protected:
    /**
     * m_id
     * 资产编号（受保护成员）。
     * 派生类可直接读写；外部代码只读（通过 id()）。
     */
    std::string m_id;
};